package com.ruoyi.web.controller.materialsRequisitiones;

import java.util.List;

import com.ruoyi.domain.*;
import com.ruoyi.framework.util.ShiroUtils;
import com.ruoyi.service.*;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.core.controller.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;

/**
 * 材料申请单Controller
 * 
 * @author ruoyi
 * @date 2020-07-23
 */
@Controller
@RequestMapping("/ruoyi/requisitiones")
public class MaterialsRequisitionesController extends BaseController
{
    private String prefix = "ruoyi/requisitiones";

    @Autowired
    private IMaterialsRequisitionesService materialsRequisitionesService;

    @Autowired
    private ISysMaterialPlanService sysMaterialPlanService;

    @RequiresPermissions("ruoyi:requisitiones:view")
    @GetMapping()
    public String requisitiones()
    {
        return prefix + "/requisitiones";
    }

    /**
     * 查询材料申请单
     */
    @RequiresPermissions("ruoyi:requisitiones:list")
    @PostMapping("/list")
    @ResponseBody
    public TableDataInfo list(MaterialsRequisitiones materialsRequisitiones)
    {
        startPage();
        List<MaterialsRequisitiones> list = materialsRequisitionesService.selectMaterialsRequisitionesList(materialsRequisitiones);
        return getDataTable(list);
    }
    /**
     * 查询总项目对应的材料申请单
     */
    @RequiresPermissions("ruoyi:requisitiones:lists")
    @PostMapping("/lists")
    @ResponseBody
    public TableDataInfo lists(Long mId)
    {
        startPage();
        List<MaterialsRequisitiones> list = materialsRequisitionesService.selectMaterialsRequisitionesLists(mId);
        return getDataTable(list);
    }

    /**
     * 导出材料申请单列表
     */
    @RequiresPermissions("ruoyi:requisitiones:export")
    @Log(title = "材料申请单", businessType = BusinessType.EXPORT)
    @PostMapping("/export")
    @ResponseBody
    public AjaxResult export(MaterialsRequisitiones materialsRequisitiones)
    {
        List<MaterialsRequisitiones> list = materialsRequisitionesService.selectMaterialsRequisitionesList(materialsRequisitiones);
        ExcelUtil<MaterialsRequisitiones> util = new ExcelUtil<MaterialsRequisitiones>(MaterialsRequisitiones.class);
        return util.exportExcel(list, "requisitiones");
    }

    /**
     * 新增材料申请单
     */
    @GetMapping("/add/{pId}")
    public String add(@PathVariable("pId") Long pId, ModelMap map)
    {
        map.put("pId", pId);
        List<MaterialsRequisitiones> sysMaterialPlanList = materialsRequisitionesService.selectMaterialsRequisitionesLists(pId);
        map.put("sysMaterialPlanList",sysMaterialPlanList);
        return prefix + "/add";
    }

    /**
     * 新增保存材料申请单
     */
    @RequiresPermissions("ruoyi:requisitiones:add")
    @Log(title = "材料申请单", businessType = BusinessType.INSERT)
    @PostMapping("/add")
    @ResponseBody
    public AjaxResult addSave(MaterialsRequisitiones materialsRequisitiones)
    {
        //自动获取申请人
        materialsRequisitiones.setmPeoples(ShiroUtils.getLoginName());
        SysMaterialPlan sysMaterialPlan=new SysMaterialPlan();
        //获取材料申请表外键id
        long mId =materialsRequisitiones.getmId();
//        //获取材料申请单材料类型
//        String matTypes=materialsRequisitiones.getMatTypes();
//        //获取材料申请单材料分类
//        String matClassifications=materialsRequisitiones.getMatClassifications();
//        //获取材料申请单材料数据
//        String matDatas=materialsRequisitiones.getMatDatas();
        //获取材料申请单材料详情
        String matDetailss=materialsRequisitiones.getMatDetailss();
//        SysMaterialPlan sysMaterialPlan1=sysMaterialPlanService.selectmatType(mId,matTypes);
//        SysMaterialPlan sysMaterialPlan2=sysMaterialPlanService.selectmatClassification(mId,matClassifications);
//        SysMaterialPlan sysMaterialPlan3=sysMaterialPlanService.selectmatData(mId,matDatas)
        //定义matnumber为材料申请单库里的数量
        long matnumber =materialsRequisitiones.getMatNumbers();
        //根据外键 查询集合
        List<MaterialsRequisitiones> materialsRequisitiones1=materialsRequisitionesService.selectnameLists(materialsRequisitiones.getMatDetailss(),mId);
        //循环添加
        for(int j =0;j<materialsRequisitiones1.size();j++){
            // 把本次提交的数量和数据库的所有数量相加
            matnumber=matnumber+materialsRequisitiones1.get(j).getMatNumbers();
           // System.out.println(matnumber);
        }
        //查询材料总计划里的材料详情
        SysMaterialPlan sysMaterialPlan4=sysMaterialPlanService.selectmatDetails(mId,matDetailss);
        //如果材料详情不为null
        if(sysMaterialPlan4!=null){
            //如果添加的数量大于材料总计划  弹出输入的数量大于预算材料总计划数量
            if(materialsRequisitiones.getMatNumbers()>sysMaterialPlan4.getMatNumber()){
                return AjaxResult.error("输入的数量大于预算材料总计划数量");
            //如果本次提交的数量和数据库的所有数量相加   大于  预算材料总计划的数量  弹出输入材料数量的总量大于预算材料总计划数量,超出数量为"+zongnum+",请更改预算材料总计划
            } else if(matnumber>sysMaterialPlan4.getMatNumber()){
                // zongnum是超出的数量   由本次提交的数量和数据库的所有数量相加 减去 预算材料总计划的数量
                long zongnum=matnumber-sysMaterialPlan4.getMatNumber();
                return AjaxResult.error("输入材料数量的总量大于预算材料总计划数量,超出数量为"+zongnum+",请更改预算材料总计划");
            }else{
                int matId=sysMaterialPlan4.getMatId();
                sysMaterialPlanService.updateSysMaterialPlans(matnumber,matId,mId);
            }
        }else{
            return toAjax(0);
        }
        return toAjax(materialsRequisitionesService.insertMaterialsRequisitiones(materialsRequisitiones));
    }

    /**
     * 修改材料申请单
     */
    @GetMapping("/edit/{mMid}")
    public String edit(@PathVariable("mMid") Long mMid, ModelMap mmap)
    {
        MaterialsRequisitiones materialsRequisitiones = materialsRequisitionesService.selectMaterialsRequisitionesById(mMid);
        mmap.put("materialsRequisitiones", materialsRequisitiones);
        return prefix + "/edit";
    }

    /**
     * 修改保存材料申请单
     */
    @RequiresPermissions("ruoyi:requisitiones:edit")
    @Log(title = "材料申请单", businessType = BusinessType.UPDATE)
    @PostMapping("/edit")
    @ResponseBody
    public AjaxResult editSave(MaterialsRequisitiones materialsRequisitiones)
    {
        return toAjax(materialsRequisitionesService.updateMaterialsRequisitiones(materialsRequisitiones));
    }

    /**
     * 删除材料申请单
     */
    @RequiresPermissions("ruoyi:requisitiones:remove")
    @Log(title = "材料申请单", businessType = BusinessType.DELETE)
    @PostMapping( "/remove")
    @ResponseBody
    public AjaxResult remove(String ids)
    {
        return toAjax(materialsRequisitionesService.deleteMaterialsRequisitionesByIds(ids));
    }

    /**
     * 提交申请
     */
    @Log(title = "审批状态", businessType = BusinessType.UPDATE)
    @PostMapping( "/submitApply")
    @ResponseBody
    public AjaxResult submitApply(Long mMid) {
        materialsRequisitionesService.submitExaStatus(mMid);

        return success();
    }

    /**
     * 撤销申请
     */
    @Log(title = "审批", businessType = BusinessType.UPDATE)
    @PostMapping( "/revocation")
    @ResponseBody
    public AjaxResult revocation(Long mMid) {
        materialsRequisitionesService.revoExaStatus(mMid);
        return success();
    }

//    @GetMapping("/plans")
//    @ResponseBody
//    public List<SysMaterialPlan> plans(SysMaterialPlan sysMaterialPlan) {
//        //首先获取到选择材料类型的id 然后通过材料类型的id去查询对象
//        List<SysMaterialPlan> sysMaterialPlans = sysMaterialPlanService.selectSysMaterialPlanList(sysMaterialPlan);
//        //获取查询到的对象需要的字段
//        return sysMaterialPlans;
//    }
//    /**
//     * 根据选择的材料数据查询拥有的材料详情
//     */
//    @GetMapping("/classmat/{aname}")
//    @ResponseBody
//    public List<SysMaterialPlan> classmat(@PathVariable("aname") String matclass,Long mId) {
//        //获取到材料类型的类型字段
//        //List<SysMaterialPlan> list = sysMaterialPlanService.selectMatdetails(matclass);
//        List<SysMaterialPlan> sysMaterialPlans = sysMaterialPlanService.selectMaterialsRequisitionesLists(mId);
//        return sysMaterialPlans;
//    }
//    /**
//     * 菜单选择起使用  根据父类查找子类
//     */
//
//    @GetMapping("/like/{pname}")
//    @ResponseBody
//    public List<SysMaterialPlan> like(SysMaterialPlan sysMaterialPlan) {
//        List<SysMaterialPlan> sysMaterialPlans = sysMaterialPlanService.selectSysMaterialPlanList(sysMaterialPlan);
//        //获取查询到的对象需要的字段
//        return  sysMaterialPlanService.selectSysMaterialPlanList(sysMaterialPlan);
//    }
//
//    /**
//     * 根据选择的材料数据查询拥有的材料详情
//     */
//    @GetMapping("/love/{type}")
//    @ResponseBody
//    public List<SysMaterialPlan> love(SysMaterialPlan sysMaterialPlan) {
//        //通过材料数据的名称去查询他的英文名字 然后通过查询到的英文名字去查询材料详情和他有关的名字
//        return sysMaterialPlanService.selectSysMaterialPlanList(sysMaterialPlan);
//    }
}
